#ifndef _RESORECODEVISITER_H_
#define _RESORECODEVISITER_H_
#include "IVisitor.h"
#include "SimpleNode.h"
#include "ast/decoratorsType.h"

class RestoreCodeVisiter: public IVisitor
{
public:
    RestoreCodeVisiter();

    virtual void visitModule(const ModulePtr& node);
    virtual void visitInteractive(const InteractivePtr& node);
    virtual void visitExpression(const ExpressionPtr& node);
    virtual void visitNameTok(const NameTokPtr& node);
    virtual void visitSuite(const SuitePtr& node);
    virtual void visitWithItem(const WithItemPtr& node);
    virtual void visitFunctionDef(const FunctionDefPtr& node);
    virtual void visitClassDef(const ClassDefPtr& node);
    virtual void visitReturn(const ReturnPtr& node);
    virtual void visitDelete(const DeletePtr& node);
    virtual void visitAssign(const AssignPtr& node);
    virtual void visitAugAssign(const AugAssignPtr& node);
    virtual void visitFor(const ForPtr& node);
    virtual void visitWhile(const WhilePtr& node);
    virtual void visitIf(const IfPtr& node);
    virtual void visitWith(const WithPtr& node);
    virtual void visitRaise(const RaisePtr& node);
    virtual void visitTryExcept(const TryExceptPtr& node);
    virtual void visitTryFinally(const TryFinallyPtr& node);
    virtual void visitAssert(const AssertPtr& node);
    virtual void visitImport(const ImportPtr& node);
    virtual void visitImportFrom(const ImportFromPtr& node);
    virtual void visitGlobal(const GlobalPtr& node);
    virtual void visitNonLocal(const NonLocalPtr& node);
    virtual void visitExpr(const ExprPtr& node);
    virtual void visitPass(const PassPtr& node);
    virtual void visitBreak(const BreakPtr& node);
    virtual void visitContinue(const ContinuePtr& node);
    virtual void visitBoolOp(const BoolOpPtr& node);
    virtual void visitBinOp(const BinOpPtr& node);
    virtual void visitUnaryOp(const UnaryOpPtr& node);
    virtual void visitLambda(const LambdaPtr& node);
    virtual void visitIfExp(const IfExpPtr& node);
    virtual void visitDict(const DictPtr& node);
    virtual void visitSet(const SetPtr& node);
    virtual void visitListComp(const ListCompPtr& node);
    virtual void visitSetComp(const SetCompPtr& node);
    virtual void visitDictComp(const DictCompPtr& node);
    virtual void visitGeneratorExp(const GeneratorExpPtr& node);
    virtual void visitYield(const YieldPtr& node);
    virtual void visitCompare(const ComparePtr& node);
    virtual void visitCall(const CallPtr& node);
    virtual void visitRepr(const ReprPtr& node);
    virtual void visitNum(const NumPtr& node);
    virtual void visitStr(const StrPtr& node);
    virtual void visitStrJoin(const StrJoinPtr& node);
    virtual void visitAttribute(const AttributePtr& node);
    virtual void visitSubscript(const SubscriptPtr& node);
    virtual void visitStarred(const StarredPtr& node);
    virtual void visitName(const NamePtr& node);
    virtual void visitList(const ListPtr& node);
    virtual void visitTuple(const TuplePtr& node);
    virtual void visitEllipsis(const EllipsisPtr& node);
    virtual void visitSlice(const SlicePtr& node);
    virtual void visitExtSlice(const ExtSlicePtr& node);
    virtual void visitIndex(const IndexPtr& node);
    virtual void visitComprehension(const ComprehensionPtr& node);

    QString code();
private:
    void visitDecorator(const decoratorsTypePtr& node);

    void beforeNode(const SimpleNodePtr& node);
    void afterNode(const SimpleNodePtr& node);
private:
    QStringList _code;
    bool _list;
    int _tupleParens;
    QHash<int, QString> operatorMap;
};

#endif
